import os
import json
import datetime

class FileExporter:
    """文件导出器，负责将数据导出为CSV或JSON格式"""
    
    @staticmethod
    def export_data(data, export_path, data_type, extension=None):
        """导出数据到文件，支持JSON和CSV格式"""
        # 如果没有指定导出路径，自动生成到export文件夹
        if not export_path:
            timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
            # 根据extension或默认使用csv格式
            file_ext = extension if extension else 'csv'
            # 设置默认导出到export文件夹
            export_path = f'export/{data_type}_export_{timestamp}.{file_ext}'
        else:
            # 从文件名中提取扩展名
            file_ext = os.path.splitext(export_path)[1].lower().lstrip('.')
            # 如果没有扩展名或extension参数指定了格式，则使用指定的格式
            if not file_ext or extension:
                file_ext = extension if extension else 'csv'
                # 确保文件名有正确的扩展名
                base_name = os.path.splitext(export_path)[0]
                export_path = f'{base_name}.{file_ext}'
        
        # 确保目录存在
        directory = os.path.dirname(export_path)
        if directory and not os.path.exists(directory):
            os.makedirs(directory)
        
        # 导出数据
        try:
            if file_ext.lower() == 'csv' and data:
                # CSV格式导出
                with open(export_path, 'w', encoding='utf-8', newline='') as f:
                    # 获取所有可能的字段名
                    fieldnames = set()
                    for item in data:
                        fieldnames.update(item.keys())
                    fieldnames = sorted(fieldnames)
                    
                    # 使用csv模块写入
                    import csv
                    writer = csv.DictWriter(f, fieldnames=fieldnames, extrasaction='ignore')
                    writer.writeheader()
                    writer.writerows(data)
            else:
                # JSON格式导出
                with open(export_path, 'w', encoding='utf-8') as f:
                    json.dump(data, f, ensure_ascii=False, indent=2)
            print(f'数据已成功导出到: {export_path}')
        except Exception as e:
            print(f'导出数据失败: {str(e)}')